<?php 
/** 
 * 数组中只出现一次的数字
 * 一个整型数组里除了两个数字之外，其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
 * 任何两个相同的数进行异或操作结果为0
 * 当数只有一个只出现一次的数字时，对所有的数字亦或后的结果就是那个只出现一次的数字
 * 当有两个时，对所有数字亦或后，亦或后的结果，就是两个只出现一次的两个不同数字的亦或结果，查看亦或结果的二进制倒数第一个为1的值的位置 如 亦或结果为0101，那么最后一个值为1的就是最后一个数，亦或因为，不同为1，那么这两个不同的值肯定为 xxxxxx1 与 xxxxx0 （不分先后顺序） ，所以将数组中的数字的二进制最后一个值为1与为0的数字，分为两组。然后分别对着两组进行亦或，每组的亦或结果就是那个只出现一次的数字
 */


function FindNumsAppearOnce($array)
{
    if (!$array) {
    	return null;
    }
    $resultOR = OrMethods($array);
    //倒数最后一个为1的位置
    $EndIndex = 0;
    while ($resultOR) {
    	if ($resultOR & 1) {
    		break;
    	}
    	$EndIndex++;
    	$resultOR = $resultOR>>1;
    }

   	$firstArr = [];
   	$secondArr = [];
   	foreach ($array as $v) {
   		if (($v>>$EndIndex) & 1) {
   			$firstArr[] = $v;
   		} else {
   			$secondArr[] = $v;
   		}
   	}
   	$firstNum = OrMethods($firstArr);
   	$secondNum = OrMethods($secondArr);
   	var_dump($firstNum , $secondNum);


}


function OrMethods($array)
{
	$resultOR = 0;
	foreach ($array as $key => $value) {
    	$resultOR = $value ^ $resultOR;
    }
    return $resultOR;
}

$arr = [2,4,3,6,3,2,5,5];

FindNumsAppearOnce($arr);